import json
from common.sendrequests import SendRequests
import yaml
import os
from conf.setting import FILE_PATH


def get_testcase_yaml(file):
    """
    获取 yaml 文件数据
    :param file: yaml文件的路径
    :return: 返回读取 yaml文件的 数据
    """
    try:
        with open(file, 'r', encoding='utf-8') as f:
            yaml_data = yaml.safe_load(f)
            return yaml_data
    except Exception as e:
        print(e)


class ReadYamlData:
    """
    读取 yaml数据，已写入数据 到 yaml文件
    """

    def __init__(self, yaml_file=None):
        if yaml_file is not None:
            self.yaml_file = yaml_file
        else:
            # self.yaml_file = 'extract.yaml'
            self.yaml_file = '../testcase/Login/login.yaml'

    def write_yaml_data(self, value):
        """
        TODO 写入数据到 yaml文件中
        :param value: 写入的数据（dict）类型 键值对
        :return:
        """
        file = None
        # file_path = r'../extract.yaml'
        file_path = FILE_PATH['extract']
        if not os.path.exists(file_path):
            # TODO 如果没有这个文件的路径就创建一个
            os.system(file_path)

        # TODO mode='a' 是写入的操作（追加的模式进行写入）
        # TODO mode='w' 是写入的操作（覆盖的模式进行写入） 会将之前的数据清除掉在写
        try:
            file = open(file_path, mode='w', encoding='utf-8')
            # TODO 限制写入的数据必须是 字典类型
            if isinstance(value, dict):
                # TODO allow_unicode=True 代表写入中文可以成功

                write_data = yaml.dump(value, allow_unicode=True, sort_keys=False)
                file.write(write_data)
            else:
                print('写入到【extract.yaml】的数据必须是字典类型的！')
        except Exception as e:
            print(e)
        finally:
            file.close()

    def get_extract_yaml(self, node_name):
        """
        读取接口提取的变量值
        :param node_name: yaml文件的 key值
        :return:
        """
        file_path = FILE_PATH['extract']
        if os.path.exists(file_path):
            pass
        else:
            print('extract.yaml文件不存在')
            # TODO 'w' 代表如果没有这个文件就创建这个文件
            file = open('../extract.yaml', 'w')
            file.close()
            print('extract.yaml文件创建成功！')

        with open('../extract.yaml', 'r', encoding='utf-8') as rf:
            extract_data = yaml.safe_load(rf)
            # print(extract_data)
            return extract_data[node_name]

if __name__ == '__main__':
    # TODO res获取的是 baseInfo 和 testCase
    res = get_testcase_yaml('../testcase/Login/login.yaml')[0]
    # TODO res2 获取的是 [{baseInfo,testCase}] 是整列表
    res2 = get_testcase_yaml('../testcase/Login/login.yaml')
    """
    json.dumps() 将Python对象转换为JSON字符串
    ensure_ascii=False 参数确保中文字符正常显示
    indent=4 参数使输出的JSON有良好的缩进格式，便于阅读
    """
    # print(json.dumps(res, ensure_ascii=False, indent=4))
    # print(res)
    # print(res2)

    url = res['baseInfo']['url']
    print(url)

    method = res['baseInfo']['method']
    print(method)

    data = res['testCase'][0]['data']
    print(data)

    header = res['baseInfo']['header']

    new_url = 'http://127.0.0.1:8787' + url
    send = SendRequests()
    result = send.run_main(url=new_url, data=data, header=None, method=method)
    print(result)

    token = result.get('token')
    print(token)

    # 文件写入
    write_data = {}
    write_data['Token'] = token
    # write_data['Test'] = token+'123123123'
    read = ReadYamlData()
    read.write_yaml_data(write_data)

    # TODO json序列化和反序列化
    # TODO 序列化就是将 字典类型 转换为 字符串类型
    json_str = json.dumps(res)
    print(json_str)
    print(type(json_str))

    # TODO 反序列化就是将字符串类型转换为字典类型
    json_dict = json.loads(json_str)
    print(json_dict)
    print(type(json_dict))

    print('-------------------')
    extract_res = read.get_extract_yaml('Token')
    print('extract_res = ', extract_res)